home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / linux / nodemask.h < prev    next >
C/C++ Source or Header  |  2005-10-13  |  11KB  |  339 lines

  1. #ifndef __LINUX_NODEMASK_H
  2. #define __LINUX_NODEMASK_H
  3.  
  4. /*
  5.  * Nodemasks provide a bitmap suitable for representing the
  6.  * set of Node's in a system, one bit position per Node number.
  7.  *
  8.  * See detailed comments in the file linux/bitmap.h describing the
  9.  * data type on which these nodemasks are based.
  10.  *
  11.  * For details of nodemask_scnprintf() and nodemask_parse(),
  12.  * see bitmap_scnprintf() and bitmap_parse() in lib/bitmap.c.
  13.  *
  14.  * The available nodemask operations are:
  15.  *
  16.  * void node_set(node, mask)        turn on bit 'node' in mask
  17.  * void node_clear(node, mask)        turn off bit 'node' in mask
  18.  * void nodes_setall(mask)        set all bits
  19.  * void nodes_clear(mask)        clear all bits
  20.  * int node_isset(node, mask)        true iff bit 'node' set in mask
  21.  * int node_test_and_set(node, mask)    test and set bit 'node' in mask
  22.  *
  23.  * void nodes_and(dst, src1, src2)    dst = src1 & src2  [intersection]
  24.  * void nodes_or(dst, src1, src2)    dst = src1 | src2  [union]
  25.  * void nodes_xor(dst, src1, src2)    dst = src1 ^ src2
  26.  * void nodes_andnot(dst, src1, src2)    dst = src1 & ~src2
  27.  * void nodes_complement(dst, src)    dst = ~src
  28.  *
  29.  * int nodes_equal(mask1, mask2)    Does mask1 == mask2?
  30.  * int nodes_intersects(mask1, mask2)    Do mask1 and mask2 intersect?
  31.  * int nodes_subset(mask1, mask2)    Is mask1 a subset of mask2?
  32.  * int nodes_empty(mask)        Is mask empty (no bits sets)?
  33.  * int nodes_full(mask)            Is mask full (all bits sets)?
  34.  * int nodes_weight(mask)        Hamming weight - number of set bits
  35.  *
  36.  * void nodes_shift_right(dst, src, n)    Shift right
  37.  * void nodes_shift_left(dst, src, n)    Shift left
  38.  *
  39.  * int first_node(mask)            Number lowest set bit, or MAX_NUMNODES
  40.  * int next_node(node, mask)        Next node past 'node', or MAX_NUMNODES
  41.  * int first_unset_node(mask)        First node not set in mask, or 
  42.  *                    MAX_NUMNODES.
  43.  *
  44.  * nodemask_t nodemask_of_node(node)    Return nodemask with bit 'node' set
  45.  * NODE_MASK_ALL            Initializer - all bits set
  46.  * NODE_MASK_NONE            Initializer - no bits set
  47.  * unsigned long *nodes_addr(mask)    Array of unsigned long's in mask
  48.  *
  49.  * int nodemask_scnprintf(buf, len, mask) Format nodemask for printing
  50.  * int nodemask_parse(ubuf, ulen, mask)    Parse ascii string as nodemask
  51.  *
  52.  * for_each_node_mask(node, mask)    for-loop node over mask
  53.  *
  54.  * int num_online_nodes()        Number of online Nodes
  55.  * int num_possible_nodes()        Number of all possible Nodes
  56.  *
  57.  * int node_online(node)        Is some node online?
  58.  * int node_possible(node)        Is some node possible?
  59.  *
  60.  * int any_online_node(mask)        First online node in mask
  61.  *
  62.  * node_set_online(node)        set bit 'node' in node_online_map
  63.  * node_set_offline(node)        clear bit 'node' in node_online_map
  64.  *
  65.  * for_each_node(node)            for-loop node over node_possible_map
  66.  * for_each_online_node(node)        for-loop node over node_online_map
  67.  *
  68.  * Subtlety:
  69.  * 1) The 'type-checked' form of node_isset() causes gcc (3.3.2, anyway)
  70.  *    to generate slightly worse code.  So use a simple one-line #define
  71.  *    for node_isset(), instead of wrapping an inline inside a macro, the
  72.  *    way we do the other calls.
  73.  */
  74.  
  75. #include <linux/kernel.h>
  76. #include <linux/threads.h>
  77. #include <linux/bitmap.h>
  78. #include <linux/numa.h>
  79. #include <asm/bug.h>
  80.  
  81. typedef struct { DECLARE_BITMAP(bits, MAX_NUMNODES); } nodemask_t;
  82. extern nodemask_t _unused_nodemask_arg_;
  83.  
  84. #define node_set(node, dst) __node_set((node), &(dst))
  85. static inline void __node_set(int node, volatile nodemask_t *dstp)
  86. {
  87.     set_bit(node, dstp->bits);
  88. }
  89.  
  90. #define node_clear(node, dst) __node_clear((node), &(dst))
  91. static inline void __node_clear(int node, volatile nodemask_t *dstp)
  92. {
  93.     clear_bit(node, dstp->bits);
  94. }
  95.  
  96. #define nodes_setall(dst) __nodes_setall(&(dst), MAX_NUMNODES)
  97. static inline void __nodes_setall(nodemask_t *dstp, int nbits)
  98. {
  99.     bitmap_fill(dstp->bits, nbits);
  100. }
  101.  
  102. #define nodes_clear(dst) __nodes_clear(&(dst), MAX_NUMNODES)
  103. static inline void __nodes_clear(nodemask_t *dstp, int nbits)
  104. {
  105.     bitmap_zero(dstp->bits, nbits);
  106. }
  107.  
  108. /* No static inline type checking - see Subtlety (1) above. */
  109. #define node_isset(node, nodemask) test_bit((node), (nodemask).bits)
  110.  
  111. #define node_test_and_set(node, nodemask) \
  112.             __node_test_and_set((node), &(nodemask))
  113. static inline int __node_test_and_set(int node, nodemask_t *addr)
  114. {
  115.     return test_and_set_bit(node, addr->bits);
  116. }
  117.  
  118. #define nodes_and(dst, src1, src2) \
  119.             __nodes_and(&(dst), &(src1), &(src2), MAX_NUMNODES)
  120. static inline void __nodes_and(nodemask_t *dstp, const nodemask_t *src1p,
  121.                     const nodemask_t *src2p, int nbits)
  122. {
  123.     bitmap_and(dstp->bits, src1p->bits, src2p->bits, nbits);
  124. }
  125.  
  126. #define nodes_or(dst, src1, src2) \
  127.             __nodes_or(&(dst), &(src1), &(src2), MAX_NUMNODES)
  128. static inline void __nodes_or(nodemask_t *dstp, const nodemask_t *src1p,
  129.                     const nodemask_t *src2p, int nbits)
  130. {
  131.     bitmap_or(dstp->bits, src1p->bits, src2p->bits, nbits);
  132. }
  133.  
  134. #define nodes_xor(dst, src1, src2) \
  135.             __nodes_xor(&(dst), &(src1), &(src2), MAX_NUMNODES)
  136. static inline void __nodes_xor(nodemask_t *dstp, const nodemask_t *src1p,
  137.                     const nodemask_t *src2p, int nbits)
  138. {
  139.     bitmap_xor(dstp->bits, src1p->bits, src2p->bits, nbits);
  140. }
  141.  
  142. #define nodes_andnot(dst, src1, src2) \
  143.             __nodes_andnot(&(dst), &(src1), &(src2), MAX_NUMNODES)
  144. static inline void __nodes_andnot(nodemask_t *dstp, const nodemask_t *src1p,
  145.                     const nodemask_t *src2p, int nbits)
  146. {
  147.     bitmap_andnot(dstp->bits, src1p->bits, src2p->bits, nbits);
  148. }
  149.  
  150. #define nodes_complement(dst, src) \
  151.             __nodes_complement(&(dst), &(src), MAX_NUMNODES)
  152. static inline void __nodes_complement(nodemask_t *dstp,
  153.                     const nodemask_t *srcp, int nbits)
  154. {
  155.     bitmap_complement(dstp->bits, srcp->bits, nbits);
  156. }
  157.  
  158. #define nodes_equal(src1, src2) \
  159.             __nodes_equal(&(src1), &(src2), MAX_NUMNODES)
  160. static inline int __nodes_equal(const nodemask_t *src1p,
  161.                     const nodemask_t *src2p, int nbits)
  162. {
  163.     return bitmap_equal(src1p->bits, src2p->bits, nbits);
  164. }
  165.  
  166. #define nodes_intersects(src1, src2) \
  167.             __nodes_intersects(&(src1), &(src2), MAX_NUMNODES)
  168. static inline int __nodes_intersects(const nodemask_t *src1p,
  169.                     const nodemask_t *src2p, int nbits)
  170. {
  171.     return bitmap_intersects(src1p->bits, src2p->bits, nbits);
  172. }
  173.  
  174. #define nodes_subset(src1, src2) \
  175.             __nodes_subset(&(src1), &(src2), MAX_NUMNODES)
  176. static inline int __nodes_subset(const nodemask_t *src1p,
  177.                     const nodemask_t *src2p, int nbits)
  178. {
  179.     return bitmap_subset(src1p->bits, src2p->bits, nbits);
  180. }
  181.  
  182. #define nodes_empty(src) __nodes_empty(&(src), MAX_NUMNODES)
  183. static inline int __nodes_empty(const nodemask_t *srcp, int nbits)
  184. {
  185.     return bitmap_empty(srcp->bits, nbits);
  186. }
  187.  
  188. #define nodes_full(nodemask) __nodes_full(&(nodemask), MAX_NUMNODES)
  189. static inline int __nodes_full(const nodemask_t *srcp, int nbits)
  190. {
  191.     return bitmap_full(srcp->bits, nbits);
  192. }
  193.  
  194. #define nodes_weight(nodemask) __nodes_weight(&(nodemask), MAX_NUMNODES)
  195. static inline int __nodes_weight(const nodemask_t *srcp, int nbits)
  196. {
  197.     return bitmap_weight(srcp->bits, nbits);
  198. }
  199.  
  200. #define nodes_shift_right(dst, src, n) \
  201.             __nodes_shift_right(&(dst), &(src), (n), MAX_NUMNODES)
  202. static inline void __nodes_shift_right(nodemask_t *dstp,
  203.                     const nodemask_t *srcp, int n, int nbits)
  204. {
  205.     bitmap_shift_right(dstp->bits, srcp->bits, n, nbits);
  206. }
  207.  
  208. #define nodes_shift_left(dst, src, n) \
  209.             __nodes_shift_left(&(dst), &(src), (n), MAX_NUMNODES)
  210. static inline void __nodes_shift_left(nodemask_t *dstp,
  211.                     const nodemask_t *srcp, int n, int nbits)
  212. {
  213.     bitmap_shift_left(dstp->bits, srcp->bits, n, nbits);
  214. }
  215.  
  216. /* FIXME: better would be to fix all architectures to never return
  217.           > MAX_NUMNODES, then the silly min_ts could be dropped. */
  218.  
  219. #define first_node(src) __first_node(&(src))
  220. static inline int __first_node(const nodemask_t *srcp)
  221. {
  222.     return min_t(int, MAX_NUMNODES, find_first_bit(srcp->bits, MAX_NUMNODES));
  223. }
  224.  
  225. #define next_node(n, src) __next_node((n), &(src))
  226. static inline int __next_node(int n, const nodemask_t *srcp)
  227. {
  228.     return min_t(int,MAX_NUMNODES,find_next_bit(srcp->bits, MAX_NUMNODES, n+1));
  229. }
  230.  
  231. #define nodemask_of_node(node)                        \
  232. ({                                    \
  233.     typeof(_unused_nodemask_arg_) m;                \
  234.     if (sizeof(m) == sizeof(unsigned long)) {            \
  235.         m.bits[0] = 1UL<<(node);                \
  236.     } else {                            \
  237.         nodes_clear(m);                        \
  238.         node_set((node), m);                    \
  239.     }                                \
  240.     m;                                \
  241. })
  242.  
  243. #define first_unset_node(mask) __first_unset_node(&(mask))
  244. static inline int __first_unset_node(const nodemask_t *maskp)
  245. {
  246.     return min_t(int,MAX_NUMNODES,
  247.             find_first_zero_bit(maskp->bits, MAX_NUMNODES));
  248. }
  249.  
  250. #define NODE_MASK_LAST_WORD BITMAP_LAST_WORD_MASK(MAX_NUMNODES)
  251.  
  252. #if MAX_NUMNODES <= BITS_PER_LONG
  253.  
  254. #define NODE_MASK_ALL                            \
  255. ((nodemask_t) { {                            \
  256.     [BITS_TO_LONGS(MAX_NUMNODES)-1] = NODE_MASK_LAST_WORD        \
  257. } })
  258.  
  259. #else
  260.  
  261. #define NODE_MASK_ALL                            \
  262. ((nodemask_t) { {                            \
  263.     [0 ... BITS_TO_LONGS(MAX_NUMNODES)-2] = ~0UL,            \
  264.     [BITS_TO_LONGS(MAX_NUMNODES)-1] = NODE_MASK_LAST_WORD        \
  265. } })
  266.  
  267. #endif
  268.  
  269. #define NODE_MASK_NONE                            \
  270. ((nodemask_t) { {                            \
  271.     [0 ... BITS_TO_LONGS(MAX_NUMNODES)-1] =  0UL            \
  272. } })
  273.  
  274. #define nodes_addr(src) ((src).bits)
  275.  
  276. #define nodemask_scnprintf(buf, len, src) \
  277.             __nodemask_scnprintf((buf), (len), &(src), MAX_NUMNODES)
  278. static inline int __nodemask_scnprintf(char *buf, int len,
  279.                     const nodemask_t *srcp, int nbits)
  280. {
  281.     return bitmap_scnprintf(buf, len, srcp->bits, nbits);
  282. }
  283.  
  284. #define nodemask_parse(ubuf, ulen, src) \
  285.             __nodemask_parse((ubuf), (ulen), &(src), MAX_NUMNODES)
  286. static inline int __nodemask_parse(const char __user *buf, int len,
  287.                     nodemask_t *dstp, int nbits)
  288. {
  289.     return bitmap_parse(buf, len, dstp->bits, nbits);
  290. }
  291.  
  292. #if MAX_NUMNODES > 1
  293. #define for_each_node_mask(node, mask)            \
  294.     for ((node) = first_node(mask);            \
  295.         (node) < MAX_NUMNODES;            \
  296.         (node) = next_node((node), (mask)))
  297. #else /* MAX_NUMNODES == 1 */
  298. #define for_each_node_mask(node, mask)            \
  299.     if (!nodes_empty(mask))                \
  300.         for ((node) = 0; (node) < 1; (node)++)
  301. #endif /* MAX_NUMNODES */
  302.  
  303. /*
  304.  * The following particular system nodemasks and operations
  305.  * on them manage all possible and online nodes.
  306.  */
  307.  
  308. extern nodemask_t node_online_map;
  309. extern nodemask_t node_possible_map;
  310.  
  311. #if MAX_NUMNODES > 1
  312. #define num_online_nodes()    nodes_weight(node_online_map)
  313. #define num_possible_nodes()    nodes_weight(node_possible_map)
  314. #define node_online(node)    node_isset((node), node_online_map)
  315. #define node_possible(node)    node_isset((node), node_possible_map)
  316. #else
  317. #define num_online_nodes()    1
  318. #define num_possible_nodes()    1
  319. #define node_online(node)    ((node) == 0)
  320. #define node_possible(node)    ((node) == 0)
  321. #endif
  322.  
  323. #define any_online_node(mask)            \
  324. ({                        \
  325.     int node;                \
  326.     for_each_node_mask(node, (mask))    \
  327.         if (node_online(node))        \
  328.             break;            \
  329.     node;                    \
  330. })
  331.  
  332. #define node_set_online(node)       set_bit((node), node_online_map.bits)
  333. #define node_set_offline(node)       clear_bit((node), node_online_map.bits)
  334.  
  335. #define for_each_node(node)       for_each_node_mask((node), node_possible_map)
  336. #define for_each_online_node(node) for_each_node_mask((node), node_online_map)
  337.  
  338. #endif /* __LINUX_NODEMASK_H */
  339.